#include<stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    int List[N];
    int i, state=0, state_0=0;
    int ThisSum=0, MaxSum=0;
    for (i = 0; i < N; i++)
        scanf("%d", &List[i]);
    int first=0, last=0, tmp_first=0, flag=1;
    for (i = 0; i < N; i++) {
        if (List[i] == 0)
            state_0 = 1; // 说明有0存在
        ThisSum += List[i];
        if (flag) {
            tmp_first = List[i]; // 发生在ThisSum < 0 后，存放可能是最大子列的第一个元素
            flag = 0;
        }
        if (ThisSum > MaxSum) {
            state = 1; // 如果state一直为0，说明都是负数或0，如果state_0也为0，说明都是负数，否则说明全都是负数和0
            MaxSum = ThisSum;
            first = tmp_first; // 此时将最大子列的第一个元素更新
            last = List[i];
        }
        else if (ThisSum < 0) {
            ThisSum = 0;
            flag = 1;
        }
    }
    if (state) {
        printf("%d", MaxSum);
        printf(" %d %d\n", first, last);
    }
    else if (state_0)
        printf("0 0 0\n");
    else 
        printf("0 %d %d\n", List[0], List[N-1]);
}
